package br.com.lucasddaniel.merchanmobile.dao;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDiskIOException;
import android.os.Environment;
import br.com.lucasddaniel.merchanmobile.bean.PacoteArquivoBean;
import br.com.lucasddaniel.merchanmobile.bean.PasseioBean;

/**
 * Classe de manipulação dos dados para enviar à persistencia.
 * 
 * @author ldsm
 * 
 */
public class PasseioRepositorio {

    private static final String SEPARADOR = ";";

    /**
     * Insere um pacote na base.
     * 
     * @param passeio
     * @throws ExcessaoBanco
     */
    public Integer inserir(PasseioBean passeio, Context ctx) throws ExcessaoBanco {
        try {
            PasseioAdaptadorBanco.abre(ctx);
            ContentValues cv = new ContentValues();
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[1].getColumnName(), passeio.getNomeTurista());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[2].getColumnName(), passeio.getNomeGuia());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[3].getColumnName(), passeio.getNomePousada());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[4].getColumnName(), passeio.getTotalGeral());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[5].getColumnName(), passeio.getDesconto());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[6].getColumnName(), passeio.getSinal());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[7].getColumnName(), passeio.getSaldoFinal());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[8].getColumnName(), passeio.getTipoDeMoeda());
            //            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
            //            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[9].getColumnName(), sdf.format(new Date().getTime()));
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[9].getColumnName(), br.com.lucasddaniel.merchanmobile.util.UtilData.formatDateTime(new Date()));
            passeio.setId(PasseioAdaptadorBanco.insere(PasseioEsquemaBanco.TABLE_NAME, cv));
        } catch (SQLiteDiskIOException diskIOException) {
            throw new ExcessaoBanco("Memoria insuficiente pra criar o item.", ExcessaoBanco.INSUFFICIENT_MEMORY);
        } finally {
            PasseioAdaptadorBanco.fecha(true);
        }

        try {
            PacoteAdaptadorBanco.abre(ctx);
            for (PacoteArquivoBean pacote : passeio.getPacotes()) {
                pacote.setId(null);
                ContentValues cvPasseio = new ContentValues();
                pacote.setIdPasseio(passeio.getId());
                cvPasseio.put(PacoteEsquemaBanco.TABLE_COLUMNS[1].getColumnName(), pacote.getNome());
                cvPasseio.put(PacoteEsquemaBanco.TABLE_COLUMNS[2].getColumnName(), pacote.getPreco());
                cvPasseio.put(PacoteEsquemaBanco.TABLE_COLUMNS[3].getColumnName(), pacote.getPrecoDolar());
                //                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
                //                cvPasseio.put(PacoteEsquemaBanco.TABLE_COLUMNS[4].getColumnName(), sdf.format(pacote.getDataHoraSaida()));
                cvPasseio.put(PacoteEsquemaBanco.TABLE_COLUMNS[4].getColumnName(), br.com.lucasddaniel.merchanmobile.util.UtilData.formatDateTime(pacote.getDataHoraSaida()));
                cvPasseio.put(PacoteEsquemaBanco.TABLE_COLUMNS[5].getColumnName(), pacote.getTransporte());
                cvPasseio.put(PacoteEsquemaBanco.TABLE_COLUMNS[6].getColumnName(), pacote.getQuantidade());
                cvPasseio.put(PacoteEsquemaBanco.TABLE_COLUMNS[7].getColumnName(), pacote.getTotal());
                cvPasseio.put(PacoteEsquemaBanco.TABLE_COLUMNS[8].getColumnName(), pacote.getTipoMoeda());
                cvPasseio.put(PacoteEsquemaBanco.TABLE_COLUMNS[9].getColumnName(), pacote.getIdPasseio());
                PacoteAdaptadorBanco.insere(PacoteEsquemaBanco.TABLE_NAME, cvPasseio);
            }
        } catch (SQLiteDiskIOException diskIOException) {
            throw new ExcessaoBanco("Memoria insuficiente pra criar o item.", ExcessaoBanco.INSUFFICIENT_MEMORY);
        } finally {
            PacoteAdaptadorBanco.fecha(true);
        }
        return passeio.getId();
    }

    /**
     * Atualiza um pacote na base.
     * 
     * @param passeio
     * @throws ExcessaoBanco
     */
    public void atualizar(PasseioBean passeio, Context ctx) throws ExcessaoBanco {
        try {
            PasseioAdaptadorBanco.abre(ctx);
            ContentValues cv = new ContentValues();
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[1].getColumnName(), passeio.getNomeTurista());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[2].getColumnName(), passeio.getNomeGuia());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[3].getColumnName(), passeio.getNomePousada());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[4].getColumnName(), passeio.getTotalGeral());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[5].getColumnName(), passeio.getDesconto());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[6].getColumnName(), passeio.getSinal());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[7].getColumnName(), passeio.getSaldoFinal());
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[8].getColumnName(), passeio.getTipoDeMoeda());
            //            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
            //            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[9].getColumnName(), sdf.format(passeio.getDataHoraVenda()));
            cv.put(PasseioEsquemaBanco.TABLE_COLUMNS[9].getColumnName(), br.com.lucasddaniel.merchanmobile.util.UtilData.formatDateTime(passeio.getDataHoraVenda()));
            PasseioAdaptadorBanco.atualiza(PasseioEsquemaBanco.TABLE_NAME, cv, "" + passeio.getId());
        } catch (SQLiteDiskIOException diskIOException) {
            throw new ExcessaoBanco("Memoria insuficiente pra criar o item.", ExcessaoBanco.INSUFFICIENT_MEMORY);
        } finally {
            PasseioAdaptadorBanco.fecha(true);
        }
    }

    /**
     * Lista todos os Passeios.
     * 
     * @return
     * @throws ExcessaoBanco
     */
    public List<PasseioBean> listar(Context ctx) throws ExcessaoBanco {
        List<PasseioBean> result = new ArrayList<PasseioBean>();
        try {
            PasseioAdaptadorBanco.abre(ctx);
            Hashtable<String, String> filters = new Hashtable<String, String>();
            Cursor cursorResult = PasseioAdaptadorBanco.getObjects(PasseioEsquemaBanco.TABLE_NAME, filters);
            if (cursorResult.moveToFirst()) {
                do {
                    PasseioBean passeio = new PasseioBean();
                    passeio.setId(cursorResult.getInt(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[0].getColumnName())));
                    passeio.setNomeTurista(cursorResult.getString(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[1].getColumnName())));
                    passeio.setNomeGuia(cursorResult.getString(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[2].getColumnName())));
                    passeio.setNomePousada(cursorResult.getString(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[3].getColumnName())));
                    passeio.setTotalGeral(cursorResult.getFloat(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[4].getColumnName())));
                    passeio.setDesconto(cursorResult.getFloat(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[5].getColumnName())));
                    passeio.setSinal(cursorResult.getFloat(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[6].getColumnName())));
                    passeio.setSaldoFinal(cursorResult.getFloat(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[7].getColumnName())));
                    passeio.setTipoDeMoeda(cursorResult.getString(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[8].getColumnName())));
                    //                    Calendar c = Calendar.getInstance();
                    //                    c.setTimeInMillis(cursorResult.getLong(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[9].getColumnName())));
                    //                                                passeio.setDataHoraVenda(new Date());
                    //                    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
                    //                    try {
                    passeio.setDataHoraVenda(br.com.lucasddaniel.merchanmobile.util.UtilData.formatDateTime(cursorResult.getString(cursorResult.getColumnIndex(PasseioEsquemaBanco.TABLE_COLUMNS[9]
                            .getColumnName()))));
                    //                    } catch (ParseException e) {
                    //                        e.printStackTrace();
                    //                    }
                    result.add(passeio);
                } while (cursorResult.moveToNext());
            }
            cursorResult.close();
        } catch (SQLiteDiskIOException diskIOException) {
            throw new ExcessaoBanco("Memoria insuficiente pra criar o item.", ExcessaoBanco.INSUFFICIENT_MEMORY);
        } finally {
            PasseioAdaptadorBanco.fecha(true);
        }
        return result;
    }

    /**
     * Pesquisa um pacote de acordo com o nome ou o registro.
     * 
     * @param pacote
     * @return
     * @throws ExcessaoBanco
     */
    public List<PacoteArquivoBean> buscarPacotes(PasseioBean passeio, Context ctx) throws ExcessaoBanco {
        List<PacoteArquivoBean> retorno = new ArrayList<PacoteArquivoBean>();
        try {
            PacoteAdaptadorBanco.abre(ctx);
            Hashtable<String, String> filters = new Hashtable<String, String>();
            if (passeio.getId() != null) {
                filters.put(PacoteEsquemaBanco.TABLE_COLUMNS[9].getColumnName(), "" + passeio.getId());
            }

            Cursor cursorResult = PacoteAdaptadorBanco.getObjects(PacoteEsquemaBanco.TABLE_NAME, filters);
            if (cursorResult.moveToFirst()) {
                do {
                    PacoteArquivoBean pacote = new PacoteArquivoBean();
                    pacote.setId(cursorResult.getInt(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[0].getColumnName())));
                    pacote.setNome(cursorResult.getString(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[1].getColumnName())));
                    pacote.setPreco(cursorResult.getFloat(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[2].getColumnName())));
                    pacote.setPrecoDolar(cursorResult.getFloat(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[3].getColumnName())));
                    //                    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
                    //                    try {
                    pacote.setDataHoraSaida(br.com.lucasddaniel.merchanmobile.util.UtilData.formatDateTime(cursorResult.getString(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[4]
                            .getColumnName()))));
                    //                                            pacote.setDataHoraSaida(new Date(cursorResult.getString(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[4].getColumnName()))));
                    //                    } catch (ParseException e) {
                    //                        e.printStackTrace();
                    //                    }
                    pacote.setTransporte(cursorResult.getString(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[5].getColumnName())));
                    pacote.setQuantidade(cursorResult.getInt(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[6].getColumnName())));
                    pacote.setTotal(cursorResult.getFloat(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[7].getColumnName())));
                    pacote.setTipoMoeda(cursorResult.getString(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[8].getColumnName())));
                    pacote.setIdPasseio(cursorResult.getInt(cursorResult.getColumnIndex(PacoteEsquemaBanco.TABLE_COLUMNS[9].getColumnName())));
                    retorno.add(pacote);
                } while (cursorResult.moveToNext());
            }
            cursorResult.close();
        } catch (SQLiteDiskIOException diskIOException) {
            throw new ExcessaoBanco("Memoria insuficiente pra criar o item.", ExcessaoBanco.INSUFFICIENT_MEMORY);
        } finally {
            PacoteAdaptadorBanco.fecha(true);
        }
        return retorno;
    }

    /**
     * Apaga tabela ao exportar dados por regra de neg�cio.
     * 
     * @throws ExcessaoBanco
     */
    public void deletarTabela() throws ExcessaoBanco {
        PasseioAdaptadorBanco.deletarTabela();
    }

    /**
     * Lista todos os pacotes do pacotes.txt do sdcard.
     * 
     * @return
     * @throws ExcessaoBanco
     */
    public List<PacoteArquivoBean> listarPacotesArquivo() throws FileNotFoundException, IOException, ExcessaoBanco {
        List<PacoteArquivoBean> retorno = new ArrayList<PacoteArquivoBean>();
        File file = new File(Environment.getExternalStorageDirectory() + "/merchanmobile/pacotes.txt");
        if (file.exists()) {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String linha = br.readLine();
            while (linha != null) {

                Calendar c = Calendar.getInstance();
                int posicao = 0;
                PacoteArquivoBean pctArq = new PacoteArquivoBean();
                String[] lin = linha.split(SEPARADOR);
                pctArq.setId(Integer.valueOf(lin[posicao++]));
                pctArq.setNome(lin[posicao++]);
                pctArq.setPreco(Float.valueOf(lin[posicao++]));
                String hora = lin[posicao++];
                Integer horaInt;
                Integer minInt;
                if (hora.equals("")) {
                    horaInt = 0;
                    minInt = 0;
                } else {
                    horaInt = (hora.split(":")[0].equals("")) ? 0 : Integer.valueOf(hora.split(":")[0]);
                    minInt = (hora.split(":")[1].equals("")) ? 0 : Integer.valueOf(hora.split(":")[1]);
                }
                c.set(Calendar.HOUR_OF_DAY, horaInt);
                c.set(Calendar.MINUTE, minInt);
                pctArq.setDataHoraSaida(c.getTime());
                pctArq.setTransporte(lin[posicao++]);
                pctArq.setPrecoDolar(Float.valueOf(lin[posicao++]));
                linha = br.readLine();
                retorno.add(pctArq);
            }
            br.close();
        } else {
            throw new FileNotFoundException("O arquivo pacotes.txt não foi encontrado ou o sdcard foi removido.");
        }

        return retorno;
    }
}
